package org.rui.rpc.proxy;

import lombok.extern.slf4j.Slf4j;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * @author: linweirui
 * @date: 2024/12/03 14:37
 */

/**
 * jdk动态代理 mock模拟调用服务代理
 * 方便在调用的远程服务宕机等不可用时可以返回默认值跑通业务流程
 */
@Slf4j
public class MockServiceProxy implements InvocationHandler {
    /**
     * 代理调用
     *
     * @return
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 根据方法的返回值类型，生成特定的默认值对象
        Class<?> type = method.getReturnType();
        log.info("===== mock invoke {} =======", method.getName());
        return getDefaultObject(type);
    }

    /**
     * 获取对象默认值
     *
     * @param type
     * @return
     */
    private Object getDefaultObject(Class<?> type) {
        if (type.isPrimitive()) {
            //基本类型返回默认值，还有待拓展的基本类型
            if (type == boolean.class) {
                return false;
            } else if (type == short.class) {
                return (short) 0;
            } else if (type == int.class) {
                return 0;
            } else if (type == long.class) {
                return 0L;
            }
        }
        //对象类型返回默认值null
        return null;
    }
}
